package com.zhj.rabbitmq.demo2;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @program: rabbimmq-demo
 * @description: 交换机消息接收 Direct类型交换机
 * @author: zhengjibin
 * @create: 2020-11-16 17:34
 * @Version 1.0
 **/
public class ExchangeDirectReceiveMessage {
    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        //配置rabbitmq的链接信息
        factory.setHost("122.112.198.94");
        factory.setPort(5672);
        factory.setUsername("admin");
        factory.setPassword("admin");
        Connection connection = null;// 定义rabbitmq的网络连接 ，一个连接
        Channel channel = null;//定义一个链接中的通道
        connection = factory.newConnection();//通过工厂获得连接
        channel = connection.createChannel();//通过连接获得通道

        String queueName = "demo2_queue";
        String exchangeName = "demo2_exchange";
        String routingkey = "demoRoutingKey";
        //channel.queueDeclare(queueName,true,false,false,null);//这段代码可以不用，只有确定队列存在，或者在生产端创建
        //channel.exchangeDeclare(exchangeName,"direct",true);//这段代码可以不用，只有确定队列存在，或者在生产端创建
        //channel.queueBind(queueName,exchangeName,routingkey);//这段代码可以不用，只有确定队列存在，或者在生产端创建

        channel.basicConsume(queueName,true,"",new DefaultConsumer(channel){
            //重写 DefaultConsumer 中的方法
            /*
                参数1：消息标签
                参数2：消息对象
                参数3：消息属性信息
                参数4：消息具体内容
                注意：DefaultConsumer 方法使用后，会启动一个线程，异步的持续监听消息队列，如果队列中有消息会自动接收
                    所以不能关闭channel和connection 对象
             */
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                //super.handleDelivery(consumerTag, envelope, properties, body);
                String message = new String(body,"UTF-8");
                System.out.println(message);
            }
        });

        //channel.close(); 消费端，不能关闭通道，和连接，如果关闭了。会造成接收时抛出异常，或者接收不到消息
        //connection.close();

    }
}
